Skip to content

Release v0.5.1 - #277

Merged
guijacquemet merged 6 commits into
mainfrom
claude/release-0.5.1
Nov 11, 2026
Merged

guijacquemet merged 6 commits into
mainfrom
claude/release-0.5.1

Conversation

@guijacquemet

@guijacquemet guijacquemet commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

What

The branch starts from main at 9a5da03, after #256-#276 were merged:

  1. d023ff9 Prepare v0.5.1 (commit A).

  2. a4154ad Points the notebook at commit A (commit B). Sets RELEASE_REF = "d023ff91289a2d2204e1ae56f7dee114d1a665e4", adds its PreprocessingNotebook() pair to RELEASE_CALLS and updates the test that asserts it. This is the same two-commit pattern as v0.5.0 (3b616a0, c74d717). git diff d023ff9 a4154ad -- src pyproject.toml is empty.

  3. 7607617 Release record in docs/conformance.md, measured on a4154ad. This commit changes only that file.

  4. Review fixes (details in the review comment):

    • 7beac12: when a cell stops with one line, that line now names the error that caused the stop (notebook, tests and docs).
    • 9f61cb9: the CHANGELOG table for bricks now lists the removed design editor API.
    • 849e09d: the release record is measured again on 9f61cb9: 5274 passed, 4 environment skips; Spec modules 1732 passed, 0 skipped.

    git diff d023ff9 849e09d -- src pyproject.toml is empty, so RELEASE_REF stays A.

The shipped notebook

  • Cell 3 calls PreprocessingNotebook(), without describe=. The call is still recorded in one place: test_notebook_file.RELEASE_CALLS maps RELEASE_REF to it, with the new pair d023ff9… → PreprocessingNotebook() (release checklist).
  • Code hidden in Colab forms: each code cell has "cellView": "form" in its metadata (AGENTS.md §7), and a test checks it.
  • A cell that cannot go on prints one line, without a traceback.
    • Each cell defines CellStop(RuntimeError), whose _render_traceback_() returns [message]. IPython shows that list in place of the traceback, so Colab and JupyterLab do the same.
    • It is used for: cell 3 run before cell 1, a refused checkout, a failed install, a failed Drive mount, and Python 3.10.
    • When a stop is caused by another error (the interface failing to import, the Drive mount failing), the line names that error. Any other error keeps its full traceback.
    • Tested in a real kernel (nbclient): the error output has traceback == [evalue].
    • It was also checked on a real Python 3.10 IPython kernel, which prints one line: "Select a Python 3.11 or newer kernel, then run this cell again."
  • Cell 3 on Colab without Drive now continues. It prints one line, "Google Drive is not mounted: only files on this Colab runtime are visible, and they are deleted when the runtime stops.", then opens the app. Before this PR it stopped and named cell 2 (Notebook: three code cells (1. Install, 2. Mount Google Drive, 3. Run preprocessing) #267). The tests are updated: tests that run the cells with exec, plus a real-kernel test with google.colab faked.
  • import tomllib has moved from the top of cell 1 into _checkout_version. The version check now comes right after the three stdlib imports and the CellStop class, and an AST test checks this.
  • The introduction is shorter and describes the 7-step app (Images → Axes → Channels → Masks → Design → Check and save → Run). The text above cell 3 now says what happens without cell 1 or without Drive.

Gate

Result
python tools/check.py on 9f61cb9 Ruff clean, 432 files formatted, pytest 5274 passed, 4 skipped, code rules passed, exit 0. On a4154ad: 5270 passed, 4 skipped (reproduced by the review)
Spec modules pytest -rsxX tests/test_spec_*.py 1732 passed, 0 skipped, 0 xfailed, from all 24 EXPECTED_MODULES. JUnit has no skipped, failure or error case
Install from GitHub at A In a fresh venv, pip install "morphobricks-preprocessing[notebook] @ git+…@d023ff9…" gives version 0.5.1 with normalization 0.4.0. The installed package files equal this branch's src (diff -r). PreprocessingNotebook() builds welcome(), steps() and results_step() (three VBoxes)
Shipped notebook in a real kernel, unmodified Fresh venv: cell 3 run first prints the one line naming cell 1. Cell 1 then pip-installs RELEASE_REF from GitHub and prints Ready: preprocessing 0.5.1; normalization 0.4.0; ipywidgets 8.1.9. Cell 2 prints its one-line note, and cell 3 displays the app. Faked google.colab: cell 1 also installs the zarr extra. Cell 3 run before cell 2 prints the Drive line and opens the app. After cell 2 mounts Drive, cell 3 opens without the line

Not run (environment skips, outside the Spec modules):

  • test_cli_log.py:166, test_folder_rules.py:199 and test_folder_rules.py:230: the file system is case-sensitive.
  • test_discovery.py:665: the tests run as root.

For the owner

  • Test the notebook from this PR with the checklist in docs/colab-release-check.md. Both links are pinned to the final head 849e09d, which holds the reviewed notebook; it installs RELEASE_REF A:
    • Colab: ''https://colab.research.google.com/github/CellMigrationLab/morphobricks-preprocessing/blob/849e09d62b95341b285c5e2f1f2d725c5d7bbc5e/notebooks/MorphoBricks_Preprocessing.ipynb''
    • Raw download for JupyterLab: '''https://raw.githubusercontent.com/CellMigrationLab/morphobricks-preprocessing/849e09d62b95341b285c5e2f1f2d725c5d7bbc5e/notebooks/MorphoBricks_Preprocessing.ipynb'''
  • Merge with a merge commit, not squash or rebase, so that RELEASE_REF d023ff9 stays reachable from main.
  • This PR creates no tag. After the merge, create it here: https://github.com/CellMigrationLab/morphobricks-preprocessing/releases/new?tag=v0.5.1&target=<merge sha>&title=v0.5.1
  • The README's @v0.5.1 pins cannot be installed until the tag exists. The README Colab badge still links to blob/main.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc

…k for the 7-step app

- pyproject, the notebook's current_version/RELEASE_TAG, the version index and the README
  pins: 0.5.1. CHANGELOG "Unreleased" becomes "v0.5.1 (10 November 2026)" with a user-facing
  summary and a migration note for users and bricks.
- Notebook: cell 3 calls PreprocessingNotebook(); every code cell is a Colab form
  ("cellView": "form"); a cell that cannot go on raises its own CellStop, shown as one line
  without a traceback; cell 3 on Colab without Drive opens the app after one line; cell 1
  checks the Python version before importing tomllib; the introduction describes the
  seven-step app.
- Tests: the one-line stops in a real kernel (cell 3 alone, a refused checkout), faked Colab
  without Drive, the cellView metadata, the version check before tomllib.
- docs/colab-release-check.md rewritten for the three cells and the seven steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF = d023ff9 (and the tests asserting it), with its
PreprocessingNotebook() call recorded in RELEASE_CALLS, the same two-commit pattern as v0.5.0
(3b616a0, c74d717). A commit cannot hold its own SHA, so the notebook installs the preparation
commit, whose package code is the release's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
check.py 5270 passed / 4 environment skips (listed as not run); Spec modules 1732 passed,
0 skipped, all 24 expected modules; install from RELEASE_REF d023ff9 verified.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
The one-line CellStop of cell 1 and cell 3 for an interface that cannot load, and of cell 2
for a failed Drive mount, dropped the error that caused it: the chained ImportError (a missing
dependency, a broken import inside the package) or the mount error (for example "Mountpoint
must not already contain files") was not shown anywhere, and the advice could be wrong.
The stop now names the cause on the same line ("... could not load (ImportError: ...)",
"Google Drive could not be connected (ValueError: ...)").

Tests: the interface stop of cells 1 and 3 names its ImportError (exec), the Drive stop names
the mount error, and in a real kernel the interface stop is one line naming the
ModuleNotFoundError while an unexpected error in cell 3 keeps its full traceback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…bricks

The bricks table named read_confirmed_design and RunInputs.design() but not the rest of the
PP-02 removal: design.ExperimentDesign, DesignChanges, default_design, load_design,
read_experiment_design, the modules design_edit and cli_design, run.design_file and
report.design_summary/design_table (each checked: no longer importable at d023ff9).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc

Copy link
Copy Markdown
Contributor Author

Independent review: ready after 2 small fixes

Verified

  • RELEASE_REF = A d023ff91289a2d2204e1ae56f7dee114d1a665e4; git diff A B -- src pyproject.toml is empty, and git diff main A -- src is empty too. The only change that touches the package is pyproject.toml going to 0.5.1. __version__ is read from the metadata.
  • Installing from GitHub at A in a fresh venv gives 0.5.1 with normalization 0.4.0, and the installed files are diff -r identical to src. PreprocessingNotebook() builds welcome, steps and results_step (three VBoxes), and the strip has seven steps: Images, Axes, Channels, Masks, Design, Save ("Check and save"), Run.
  • B's notebook ran unmodified in a real kernel in a fresh venv:
    • cell 3 alone gives one line naming cell 1;
    • cell 1 pip-installs A and prints Ready 0.5.1 / 0.4.0;
    • cell 1 run again installs nothing;
    • cell 2 outside Colab prints its one-line note;
    • cell 3 shows the app.
  • With google.colab faked, cell 1 adds the zarr extra, and cell 3 without Drive prints the one Drive line and still opens the app.
  • An unexpected error in cell 3 keeps its full traceback.
  • Gate on B reproduced: 5270 passed, 4 environment skips; Spec modules 1732 passed, 0 skipped (JUnit clean).
  • I checked every brick-table entry in the CHANGELOG by import against the venv. Each is accurate.

Fixed

  1. 7beac12: the one-line CellStop hid the real error. This happened for cells 1 and 3 when the interface fails to import (the chained ImportError, for example a missing dependency or a broken import inside the package) and for cell 2 when the Drive mount fails (for example "Mountpoint must not already contain files"). The cause was not shown anywhere. The stop now names it on the same line, as "… could not load (ImportError: …)" and "Google Drive could not be connected (ValueError: …)". New tests: exec tests for both cells and the Drive stop, plus real-kernel tests showing the interface stop is one line naming the error and that an unexpected error keeps its traceback. 3 of these fail on B. I also updated AGENTS.md, the CHANGELOG, and plan Q58, whose amendment still said cell 3 stops without Drive.
  2. 9f61cb9: the brick migration table was missing the rest of the design-editor removal: ExperimentDesign, DesignChanges, default_design, load_design, read_experiment_design, the design_edit and cli_design modules, run.design_file, and report.design_summary/design_table.
  3. 849e09d: the record is re-measured on 9f61cb9: 5274 passed, 4 environment skips; Spec 1732 passed, 0 skipped.

No A/B redo was needed: nothing that RELEASE_REF installs changed. Owner test link for the final notebook (it still installs A): https://colab.research.google.com/github/CellMigrationLab/morphobricks-preprocessing/blob/849e09d62b95341b285c5e2f1f2d725c5d7bbc5e/notebooks/MorphoBricks_Preprocessing.ipynb


Generated by Claude Code

@guijacquemet
guijacquemet merged commit 8726cb4 into main Nov 11, 2026
7 checks passed
@guijacquemet
guijacquemet deleted the claude/release-0.5.1 branch November 11, 2026 00:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants